package com.zed.api.domain;

/**
 * {@link Removable}, 标识已经被标记的领域对象
 *
 * @author Zed
 */
public interface Removable {

    /**
     * 是否标记移除
     *
     * @return {@link boolean},返回<code>true</code>表示已标记移除，否则返回<code>false</code>
     */
    boolean removed();

    /**
     * 判断<code>target</code>是否标记移除
     *
     * @param target {@link T},目标对象
     * @return {@link boolean}, 返回<code>true</code>表示已标记移除，
     * 返回<code>false</code>表示可能不支持可移除，或者未标记移除。
     */
    static <T> boolean isRemoved(T target) {
        if (target == null) return false;
        if (target instanceof Removable) {
            return ((Removable) target).removed();
        }

        return false;
    }
}
